package net.xo68.destiny.core.lock;

/**
 * 周期分布式锁存储实现
 * @author wuxie
 * @date 2020-12-15
 */
public interface DistributedLockStore {

    /**
     * 尝试加锁，等待时间内无法取到锁，就放弃；另在周期内已经有运行成功的也放弃
     * @param lockKey 锁标识
     * @param lockHold 持有者
     * @param tryTimeoutSecond 尝试申请锁的超时时间，超过后放弃申请锁
     * @param periodSecond 锁定周期，在周期内只能运行一次
     * @return 返回锁实体，空时，未申请到锁
     */
    DistributedLockInfo tryLock(String lockKey, String lockHold, long tryTimeoutSecond,long periodSecond);

    /**
     *  尝试加锁，等待时间内无法取到锁，就放弃；
     * @param lockKey 锁标识
     * @param lockHold 持有者
     * @param tryTimeoutSecond 尝试申请锁的超时时间，超过后放弃申请锁
     * @return 返回锁实体，空时，未申请到锁
     */
    default DistributedLockInfo tryLock(String lockKey, String lockHold, long tryTimeoutSecond){
        return tryLock(lockKey,lockHold,tryTimeoutSecond,0L);
    }

    /**
     * 释放锁
     * @param distributedLockInfo
     */
    void unLock(DistributedLockInfo distributedLockInfo);
}
